Index: core/src/main/java/com/xpn/xwiki/api/Document.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/api/Document.java	(revision 3127)
+++ core/src/main/java/com/xpn/xwiki/api/Document.java	(working copy)
@@ -286,6 +286,14 @@
     }
 
     /**
+     * return the comment of the latest update of the document
+     */
+    public String getComment()
+    {
+        return doc.getComment();
+    }
+
+    /**
      * return the list of possible traduction for this document
      */
     public List getTranslationList() throws XWikiException
@@ -1398,10 +1406,20 @@
         getDoc().setDefaultTemplate(dtemplate);
     }
 
+    public void setComment(String comment)
+    {
+        getDoc().setComment(comment);
+    }
+
     public void save() throws XWikiException
     {
+        save("");
+    }
+
+    public void save(String comment) throws XWikiException
+    {
         if (hasAccessLevel("edit")) {
-            saveDocument();
+            saveDocument(comment);
         } else {
             java.lang.Object[] args = {getDoc().getFullName()};
             throw new XWikiException(XWikiException.MODULE_XWIKI_ACCESS,
@@ -1412,8 +1430,14 @@
 
     public void saveWithProgrammingRights() throws XWikiException
     {
+        saveWithProgrammingRights("");
+
+    }
+
+    public void saveWithProgrammingRights(String comment) throws XWikiException
+    {
         if (hasProgrammingRights()) {
-            saveDocument();
+            saveDocument(comment);
         } else {
             java.lang.Object[] args = {getDoc().getFullName()};
             throw new XWikiException(XWikiException.MODULE_XWIKI_ACCESS,
@@ -1422,9 +1446,9 @@
         }
     }
 
-    private void saveDocument() throws XWikiException
+    private void saveDocument(String comment) throws XWikiException
     {
-        getXWikiContext().getWiki().saveDocument(getDoc(), olddoc, getXWikiContext());
+        getXWikiContext().getWiki().saveDocument(getDoc(), olddoc, comment, getXWikiContext());
         olddoc = doc;
     }
 
Index: core/src/main/java/com/xpn/xwiki/api/XWiki.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/api/XWiki.java	(revision 3127)
+++ core/src/main/java/com/xpn/xwiki/api/XWiki.java	(working copy)
@@ -2233,7 +2233,48 @@
         return xwiki.hasTags(getXWikiContext());
     }
 
+
     /**
+     * API to check if the edit comment feature is active
+     * Edit comments are activated in xwiki.cfg or in the XWiki Preferences
+     * @return
+     */
+    public boolean hasEditComment()
+    {
+        return xwiki.hasEditComment(context);
+    }
+
+    /**
+     * API to check if the edit comment field is shown in the edit form
+     * Edit comments are activated in xwiki.cfg or in the XWiki Preferences
+     * @return
+     */
+    public boolean isEditCommentFieldHidden()
+    {
+        return xwiki.isEditCommentFieldHidden(context);
+    }
+
+    /**
+     * API to check if the edit comment is suggested (prompted once by Javascript if empty)
+     * Edit comments are activated in xwiki.cfg or in the XWiki Preferences
+     * @return
+     */
+    public boolean isEditCommentSuggested()
+    {
+        return xwiki.isEditCommentSuggested(context);
+    }
+
+    /**
+     * API to check if the edit comment is mandatory (prompted by Javascript if empty)
+     * Edit comments are activated in xwiki.cfg or in the XWiki Preferences
+     * @return
+     */
+    public boolean isEditCommentMandatory()
+    {
+        return xwiki.isEditCommentMandatory(context);
+    }
+
+    /**
      * API to rename a page (experimental) Rights are necessary to edit the source and target page
      * All objects and attachments ID are modified in the process to link to the new page name
      * 
Index: core/src/main/java/com/xpn/xwiki/doc/XWikiDocument.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/doc/XWikiDocument.java	(revision 3127)
+++ core/src/main/java/com/xpn/xwiki/doc/XWikiDocument.java	(working copy)
@@ -148,6 +148,9 @@
 
     private BaseObject tags;
 
+    // Comment on the latest modification
+    private String comment;
+
     // Used to make sure the MetaData String is regenerated
     private boolean isContentDirty = true;
 
@@ -313,6 +316,7 @@
         this.defaultLanguage = "";
         this.attachmentList = new ArrayList();
         this.customClass = "";
+        this.comment = "";
     }
 
     public XWikiDocument getParentDoc()
@@ -1502,6 +1506,11 @@
             setParent(parent);
         }
 
+        String comment = eform.getComment();
+        if (comment != null) {
+            setComment(comment);
+        }
+
         String tags = eform.getTags();
         if (tags != null) {
             setTags(tags, context);
@@ -1738,6 +1747,7 @@
         setTranslation(document.getTranslation());
         setxWikiClass((BaseClass) document.getxWikiClass().clone());
         setxWikiClassXML(document.getxWikiClassXML());
+        setComment(document.getComment());
 
         clonexWikiObjects(document);
         copyAttachments(document);
@@ -1783,6 +1793,7 @@
             doc.setTranslation(getTranslation());
             doc.setxWikiClass((BaseClass) getxWikiClass().clone());
             doc.setxWikiClassXML(getxWikiClassXML());
+            doc.setComment(getComment());
             doc.clonexWikiObjects(this);
             doc.copyAttachments(this);
             doc.elements = elements;
@@ -1900,6 +1911,10 @@
             return false;
         }
 
+        if (!getComment().equals(doc.getComment())) {
+            return false;
+        }
+
         if (!getxWikiClass().equals(doc.getxWikiClass())) {
             return false;
         }
@@ -2089,6 +2104,10 @@
         el.addText(getValidationScript());
         docel.add(el);
 
+        el = new DOMElement("comment");
+        el.addText(getComment());
+        docel.add(el);
+
         List alist = getAttachmentList();
         for (int ai = 0; ai < alist.size(); ai++) {
             XWikiAttachment attach = (XWikiAttachment) alist.get(ai);
@@ -2270,6 +2289,7 @@
         setTitle(getElement(docel, "title"));
         setDefaultTemplate(getElement(docel, "defaultTemplate"));
         setValidationScript(getElement(docel, "validationScript"));
+        setComment(getElement(docel, "comment"));
 
         String strans = getElement(docel, "translation");
         if ((strans == null) || strans.equals("")) {
@@ -3926,6 +3946,20 @@
         }
     }
 
+    public String getComment()
+    {
+        if (comment == null) {
+            return "";
+        }
+        return comment;
+    }
+
+    public void setComment(String comment)
+    {
+        this.comment = comment;
+        setMetaDataDirty(true);
+    }
+
     public BaseObject newObject(String classname, XWikiContext context) throws XWikiException
     {
         int nb = createNewObject(classname, context);
Index: core/src/main/java/com/xpn/xwiki/plugin/ldap/LDAPPlugin.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/plugin/ldap/LDAPPlugin.java	(revision 3127)
+++ core/src/main/java/com/xpn/xwiki/plugin/ldap/LDAPPlugin.java	(working copy)
@@ -415,11 +415,12 @@
 
             if (wikiname != null && wikiname.length() > 0) {
                 XWikiDocument doc = context.getWiki().getDocument(fullwikiname, context);
+                XWikiDocument oldDoc = (XWikiDocument) doc.clone();
                 doc.setParent("");
                 doc.addObject(bclass.getName(), bobj);
                 doc.setContent("#includeForm(\"XWiki.XWikiUserSheet\")");
                 context.getWiki().protectUserPage(fullwikiname, "edit", doc, context);
-                context.getWiki().saveDocument(doc, null, context);
+                context.getWiki().saveDocument(doc, oldDoc, context.getMessageTool().get("core.comment.createduser"), context);
                 context.getWiki().setUserDefaultGroup(fullwikiname, context);
                 return true;
             }
Index: core/src/main/java/com/xpn/xwiki/user/impl/LDAP/LDAPAuthServiceImpl.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/user/impl/LDAP/LDAPAuthServiceImpl.java	(revision 3127)
+++ core/src/main/java/com/xpn/xwiki/user/impl/LDAP/LDAPAuthServiceImpl.java	(working copy)
@@ -174,13 +174,14 @@
 
             if (name != null && name.length() > 0) {
                 XWikiDocument doc = context.getWiki().getDocument(fullwikiname, context);
+                XWikiDocument oldDoc = (XWikiDocument) doc.clone();
                 doc.setParent("");
                 doc.addObject(bclass.getName(), bobj);
                 doc.setContent("#includeForm(\"XWiki.XWikiUserSheet\")");
 
                 context.getWiki().ProtectUserPage(context, fullwikiname, "edit", doc);
 
-                context.getWiki().saveDocument(doc, null, context);
+                context.getWiki().saveDocument(doc, oldDoc, context.getMessageTool().get("core.comment.createduser"), context);
 
                 context.getWiki().SetUserDefaultGroup(context, fullwikiname);
             }
Index: core/src/main/java/com/xpn/xwiki/web/CommentAddAction.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/web/CommentAddAction.java	(revision 3127)
+++ core/src/main/java/com/xpn/xwiki/web/CommentAddAction.java	(working copy)
@@ -58,7 +58,7 @@
                 newobject.setNumber(oldobject.getNumber());
                 newobject.setName(doc.getFullName());
                 doc.setObject(className, nb, newobject);
-                xwiki.saveDocument(doc, olddoc, context);
+                xwiki.saveDocument(doc, olddoc, context.getMessageTool().get("core.comment.addcomment"), context);
             }
             // forward to edit
             String redirect = Utils.getRedirect("edit", context);
Index: core/src/main/java/com/xpn/xwiki/web/ObjectAddAction.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/web/ObjectAddAction.java	(revision 3127)
+++ core/src/main/java/com/xpn/xwiki/web/ObjectAddAction.java	(working copy)
@@ -67,7 +67,7 @@
         if (doc.isNew()) {
             doc.setCreator(username);
         }
-        xwiki.saveDocument(doc, olddoc, context);
+        xwiki.saveDocument(doc, olddoc, context.getMessageTool().get("core.comment.addobject"), context);
 
         // forward to edit
         String redirect = Utils.getRedirect("edit", context);
Index: core/src/main/java/com/xpn/xwiki/web/ObjectRemoveAction.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/web/ObjectRemoveAction.java	(revision 3127)
+++ core/src/main/java/com/xpn/xwiki/web/ObjectRemoveAction.java	(working copy)
@@ -46,7 +46,7 @@
         objects.set(classId, null);
         doc.addObjectsToRemove(object);
         doc.setAuthor(context.getUser());
-        xwiki.saveDocument(doc, olddoc, context);
+        xwiki.saveDocument(doc, olddoc, context.getMessageTool().get("core.comment.removeobject"), context);
 
         // forward to edit
         String redirect = Utils.getRedirect("edit", context);
Index: core/src/main/java/com/xpn/xwiki/web/PropAddAction.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/web/PropAddAction.java	(revision 3127)
+++ core/src/main/java/com/xpn/xwiki/web/PropAddAction.java	(working copy)
@@ -66,7 +66,7 @@
                 if (doc.isNew()) {
                     doc.setCreator(username);
                 }
-                xwiki.saveDocument(doc, olddoc, context);
+                xwiki.saveDocument(doc, olddoc, context.getMessageTool().get("core.comment.addproperty"), context);
             }
         }
         // forward to edit
Index: core/src/main/java/com/xpn/xwiki/web/PropUpdateAction.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/web/PropUpdateAction.java	(revision 3127)
+++ core/src/main/java/com/xpn/xwiki/web/PropUpdateAction.java	(working copy)
@@ -76,7 +76,7 @@
 
         doc.setxWikiClass(bclass2);
         doc.renameProperties(bclass.getName(), fieldsToRename);
-        xwiki.saveDocument(doc, olddoc, context);
+        xwiki.saveDocument(doc, olddoc, context.getMessageTool().get("core.comment.updateproperty"), context);
 
         // We need to load all documents that use this property and rename it
         if (fieldsToRename.size() > 0) {
@@ -89,7 +89,7 @@
             for (int i = 0; i < list.size(); i++) {
                 XWikiDocument doc2 = xwiki.getDocument((String) list.get(i), context);
                 doc2.renameProperties(bclass.getName(), fieldsToRename);
-                xwiki.saveDocument(doc2, doc2, context);
+                xwiki.saveDocument(doc2, doc2, context.getMessageTool().get("core.comment.updatepropertyname"), context);
             }
         }
         xwiki.flushCache();
Index: core/src/main/java/com/xpn/xwiki/web/RollbackAction.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/web/RollbackAction.java	(revision 3127)
+++ core/src/main/java/com/xpn/xwiki/web/RollbackAction.java	(working copy)
@@ -26,6 +26,9 @@
 import com.xpn.xwiki.XWikiException;
 import com.xpn.xwiki.doc.XWikiDocument;
 
+import java.util.List;
+import java.util.ArrayList;
+
 public class RollbackAction extends XWikiAction {
 	public boolean action(XWikiContext context) throws XWikiException {
         XWiki xwiki = context.getWiki();
@@ -63,7 +66,9 @@
         newdoc.setRCSVersion(tdoc.getRCSVersion());
         newdoc.setVersion(tdoc.getVersion());
         newdoc.setContentDirty(true);
-        xwiki.saveDocument(newdoc, olddoc, context);
+        List params = new ArrayList();
+        params.add(rev);
+        xwiki.saveDocument(newdoc, olddoc, context.getMessageTool().get("core.comment.rollback", params), context);
 
         // forward to view
         String redirect = Utils.getRedirect("view", context);
Index: core/src/main/java/com/xpn/xwiki/web/SaveAction.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/web/SaveAction.java	(revision 3127)
+++ core/src/main/java/com/xpn/xwiki/web/SaveAction.java	(working copy)
@@ -111,7 +111,7 @@
             // Make sure we have at least the meta data dirty status
             tdoc.setMetaDataDirty(true);
 
-            xwiki.saveDocument(tdoc, olddoc, context);
+            xwiki.saveDocument(tdoc, olddoc, tdoc.getComment(), context);
 			XWikiLock lock = tdoc.getLock(context);
 			if (lock != null)
 				tdoc.removeLock(context);
Index: core/src/main/java/com/xpn/xwiki/XWiki.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/XWiki.java	(revision 3127)
+++ core/src/main/java/com/xpn/xwiki/XWiki.java	(working copy)
@@ -885,6 +885,11 @@
 
     public void saveDocument(XWikiDocument doc, XWikiContext context) throws XWikiException
     {
+        saveDocument(doc, "", context);
+    }
+
+    public void saveDocument(XWikiDocument doc, String comment, XWikiContext context) throws XWikiException
+    {
         String server = null, database = null;
         try {
             server = doc.getDatabase();
@@ -901,9 +906,14 @@
         }
     }
 
-    public void saveDocument(XWikiDocument doc, XWikiDocument olddoc, XWikiContext context)
-        throws XWikiException
+    public void saveDocument(XWikiDocument doc, XWikiDocument olddoc, XWikiContext context) throws XWikiException
     {
+        saveDocument(doc, olddoc, "", context);
+    }
+
+    public void saveDocument(XWikiDocument doc, XWikiDocument olddoc, String comment, XWikiContext context)
+            throws XWikiException
+    {
         String server = null, database = null;
         try {
             server = doc.getDatabase();
@@ -912,9 +922,13 @@
                 database = context.getDatabase();
                 context.setDatabase(server);
             }
+
+            // Setting comment before saving
+            doc.setComment((comment==null) ? "" : comment);
+    
             getStore().saveXWikiDoc(doc, context);
             getNotificationManager().verify(doc, olddoc,
-                XWikiDocChangeNotificationInterface.EVENT_CHANGE, context);
+                    XWikiDocChangeNotificationInterface.EVENT_CHANGE, context);
         } finally {
             if ((server != null) && (database != null)) {
                 context.setDatabase(database);
@@ -2758,11 +2772,14 @@
 
             // TODO: Verify existing user
             XWikiDocument doc = getDocument(fullwikiname, context);
+
             if (!doc.isNew()) {
                 // TODO: throws Exception
                 return -3;
             }
 
+            XWikiDocument oldDoc = (XWikiDocument) doc.clone();
+
             /*
              * if(!this.checkAccess("register", doc, context)){ return -1; }
              */
@@ -2777,7 +2794,7 @@
 
             protectUserPage(fullwikiname, userRights, doc, context);
 
-            saveDocument(doc, null, context);
+            saveDocument(doc, oldDoc, context.getMessageTool().get("core.comment.createduser"), context);
 
             // Now let's add the user to XWiki.XWikiAllGroup
             setUserDefaultGroup(fullwikiname, context);
@@ -2799,14 +2816,16 @@
         BaseClass gclass = getGroupClass(context);
 
         XWikiDocument allgroupdoc = getDocument("XWiki.XWikiAllGroup", context);
+        XWikiDocument oldDoc = (XWikiDocument) allgroupdoc.clone();
 
+
         BaseObject memberobj = (BaseObject) gclass.newObject(context);
         memberobj.setClassName(gclass.getName());
         memberobj.setName(allgroupdoc.getFullName());
         memberobj.setStringValue("member", fullwikiname);
         allgroupdoc.addObject(gclass.getName(), memberobj);
         if (allgroupdoc.isNew()) {
-            saveDocument(allgroupdoc, null, context);
+            saveDocument(allgroupdoc, oldDoc, context.getMessageTool().get("core.comment.addedusertogroup"), context);
         } else {
             getHibernateStore().saveXWikiObject(memberobj, context, true);
         }
@@ -4740,8 +4759,48 @@
         else
             return dweb;
     }
-                            
 
+    public boolean hasEditComment(XWikiContext context)
+    {
+        String bl = getXWikiPreference("editcomment", "", context);
+        if ("1".equals(bl))
+            return true;
+        if ("0".equals(bl))
+            return false;
+        return "1".equals(Param("xwiki.editcomment", "0"));
+    }
+
+    public boolean isEditCommentFieldHidden(XWikiContext context)
+    {
+        String bl = getXWikiPreference("editcomment_hidden", "", context);
+        if ("1".equals(bl))
+            return true;
+        if ("0".equals(bl))
+            return false;
+        return "1".equals(Param("xwiki.editcomment.hidden", "0"));
+    }
+
+    public boolean isEditCommentSuggested(XWikiContext context)
+    {
+        String bl = getXWikiPreference("editcomment_suggested", "", context);
+        if ("1".equals(bl))
+            return true;
+        if ("0".equals(bl))
+            return false;
+        return "1".equals(Param("xwiki.editcomment.suggested", "0"));
+    }
+
+    public boolean isEditCommentMandatory(XWikiContext context)
+    {
+        String bl = getXWikiPreference("editcomment_mandatory", "", context);
+        if ("1".equals(bl))
+            return true;
+        if ("0".equals(bl))
+            return false;
+        return "1".equals(Param("xwiki.editcomment.mandatory", "0"));
+    }
+
+
     /**
      * @deprecated use {@link XWikiDocument#rename(String, XWikiContext)} instead
      */
Index: core/src/main/resources/ApplicationResources.properties
===================================================================
--- core/src/main/resources/ApplicationResources.properties	(revision 3127)
+++ core/src/main/resources/ApplicationResources.properties	(working copy)
@@ -675,3 +675,16 @@
 core.paging.lastPage=Last &raquo;
 
 tempdirnotset=Temporary directory not set. Please follow the instructions on <a href="http://www.xwiki.org/xwiki/bin/view/FAQ/WhyAmIGettingANullPointerExceptionWhenUploadingFiles">xwiki.org</a> on how to fix this.
+
+# comments for history
+core.comment=Comment
+core.comment.prompt=Enter a comment describing your modification
+core.comment.addcomment=Added comment
+core.comment.addobject=Added object
+core.comment.removeobject=Removed object
+core.comment.addproperty=Added property
+core.comment.updateproperty=Updated property
+core.comment.updatepropertyname=Updated property name
+core.comment.createduser=Created user
+core.comment.addedusertogroup=Added user to group
+core.comment.rollback=Rollback to version {0}
Index: core/src/main/resources/ApplicationResources_en.properties
===================================================================
--- core/src/main/resources/ApplicationResources_en.properties	(revision 3127)
+++ core/src/main/resources/ApplicationResources_en.properties	(working copy)
@@ -26,7 +26,7 @@
 edit=Edit
 editcontent=Edit Content
 edithtmlcontent=Edit Wysiwyg
-editinline=Edit Form
+editinline=Form
 editrights=Page Access Rights
 editobject=Objects
 editclass=Class
@@ -64,10 +64,10 @@
 lastauthor=Last Author
 filename=Filename
 default=default
-confirmobjectremove=Are you sure you want to remove this object ?
-confirmdelete=This action is not reversible. Are you sure you want to delete this document ?
-confirmdelete2=Please confirm you want to delete this document ?
-confirmdelattachment=Please confirm you want to delete this attachment ?
+confirmobjectremove=Are you sure you want to remove this object?
+confirmdelete=This action is not reversible. Are you sure you want to delete this document?
+confirmdelete2=Please confirm you want to delete this document?
+confirmdelattachment=Please confirm you want to delete this attachment?
 deleted=The document has been deleted.
 editincludepagemsg=This document contains (an) included page(s). To edit this page, click on the following links:
 youareediting=You are editing the following translation
@@ -147,7 +147,6 @@
 params=Parameters
 skin=Skin
 presentation=Presentation
-editing=Editing
 registration=Registration
 multilingual=Multi Lingual
 default_language=Default Language
@@ -193,6 +192,7 @@
 actiondoesnotexist=This action does not exist !
 thiswikidoesnotexist=This Wiki does not exist on this server.
 thispagedoesnotexist=The requested document could not be found.
+nosuchobject=The specified object does not exist
 thispagealreadyexists=This document already exists.
 availableversionsattachment=The available versions of file '$attachment.filename' are:
 attachmentdoesnotexist=The attachment does not exist.
@@ -366,8 +366,8 @@
 choosemacro=Choose a macro :
 
 resetversions=Reset Versions
-confirmresetversions=This action is not reversible. Are you sure you want to reset versions for this document ?
-confirmresetversions2=Please confirm you want to reset versions for this document ?
+confirmresetversions=This action is not reversible. Are you sure you want to reset versions for this document?
+confirmresetversions2=Please confirm you want to reset versions for this document?
 resetversionsdone=The versions have been reset for this document.
 
 createdon=on
@@ -429,6 +429,8 @@
 avatar=User photo
 Error=Error
 error=Error
+warning=Warning
+Warning=Warning
 uploadavatarfile=Upload new user photo
 setthisavatar=Set this photo
 notauser=This is not a user!
@@ -475,6 +477,7 @@
 saveandview=Save &amp; View
 whyamiseeingthis=Why am I seeing this?
 
+editing=Editing
 editWiki=Wiki
 editVisual=WYSIWYG
 editAttachments=Attachments
@@ -484,6 +487,17 @@
 editHistory=History
 editFullScreen=Full Screen
 
+administrating=Administrating
+adminingprefs=Global preferences
+adminingspaceprefs=Preferences for space $doc.space
+adminingglobalrights=Global access rights
+adminingspacerights=Access rights for space $doc.space
+adminingusers=Users
+adminingExport=Database export
+adminingImport=Database import
+adminingexport=Database export
+adminingimport=Database import
+
 #login
 nousername=No user name given
 nopassword=No password given
@@ -565,13 +579,14 @@
 import_listofskippedfiles=List of skipped documents
 import_listoferrorfiles=List of documents with errors
 
-registerwelcome=Welcome on the registration form. This will allow you to edit pages, once the admin gives you appropriate rights
+registerwelcome=Welcome to the registration form. This will allow you to edit pages, once the admin gives you appropriate rights
 email=e-Mail address
 passwordrepeat=Password (repeat)
 loginid=Login ID
 iregister=Register
 passwordmismatch=Passwords are different or password is empty
 useralreadyexists=User already exists
+invalidusername=Invalid username provided. Please use only letters from the latin alphabet, numbers, and the underscore character.
 registerfailed=Registration has failed
 registerfailedcode=code
 registersuccessful=Registration successful
@@ -581,4 +596,95 @@
 showLeftPanels=Show Left Panels
 showRightPanels=Show Right Panels
 pageWidth=Page Width
-tags=Tags
\ No newline at end of file
+tags=Tags
+
+removethisuserfromgroup=Remove this user from the group
+userdeletioncannotbecanceled=Deletions cannot be cancelled.
+addusertogroup=Add a user to this group
+
+panelsavesuccess=The layout has been saved properly.
+panelsaveerror=An error occured while trying to save the panel layout.
+spaceandname=Space and Page Name
+create=Create
+createpage=Page
+createspace=Space
+createblogpost=Blog post
+createevent=Event
+createpanel=Panel
+
+# Event calendar
+eventCalendarTitle=Event Calendar
+eventList=Event List
+eventNew=New Event
+eventTitle=Title
+eventStartdate=Start date inclusive (dd/MM/yyyy)
+eventEnddate=End date inclusive (dd/MM/yyyy)
+eventLocation=Location
+eventCategory=Category
+eventURL=URL
+eventDescription=Description
+eventAdd=Add
+
+dtFrom=From
+dtTo=to
+moreinfo=More information
+
+# Password change form
+changepassword=Changing password for {0}
+newpassword=New password
+reenterpassword=Reenter password
+setthispassword=Update
+cancelpwd=&#xAB; Cancel and return to profile
+passwordmissmatch=The two passwords do not match!
+
+# User profile page
+userProfile=Profile of <span class="fn">{0}</span>
+userChangepassword=Change password
+userModifyprofile=Modify your profile
+userChangephoto=Change your photo
+userSwitchSimple=Switch to Simple edit mode
+userSwitchAdvanced=Switch to Advanced edit mode
+userFirstname=First name
+userLastname=Last name
+userBlog=Blog
+userBlogFeed=Blog Feed
+usereMail=eMail
+userCompany=Company
+userCity=City
+userCountry=Country
+userAbout=Description
+
+core.footnotes.gotofootnote=Go to footnote {0}
+core.footnotes.backtoref=Back to footnote reference
+
+# Rename
+core.rename.defaultTitle=NewName
+core.rename.title.newName=New document name
+core.rename.title.updateDocs=Documents having backlinks to modify
+core.rename.submit=Rename
+core.rename.success=Successfully renamed {0} to <a href="{2}">{1}</a>
+core.rename.emptyName=Please enter a valid name!
+core.rename.alreadyExists=A document with the given name (<a href="{1}">{0}</a>) already exists. Please provide a different name.
+rename=Rename
+
+# Paging links
+core.paging.pageNumberOf=Page {0} of {1}
+core.paging.firstPage=&laquo; First
+core.paging.previousPage=&lt; Previous
+core.paging.nextPage=Next &gt;
+core.paging.lastPage=Last &raquo;
+
+tempdirnotset=Temporary directory not set. Please follow the instructions on <a href="http://www.xwiki.org/xwiki/bin/view/FAQ/WhyAmIGettingANullPointerExceptionWhenUploadingFiles">xwiki.org</a> on how to fix this.
+
+# comments for history
+core.comment=Comment
+core.comment.prompt=Enter a comment describing your modification
+core.comment.addcomment=Added comment
+core.comment.addobject=Added object
+core.comment.removeobject=Removed object
+core.comment.addproperty=Added property
+core.comment.updateproperty=Updated property
+core.comment.updatepropertyname=Updated property name
+core.comment.createduser=Created user
+core.comment.addedusertogroup=Added user to group
+core.comment.rollback=Rollback to version {0}
Index: core/src/main/resources/ApplicationResources_fr.properties
===================================================================
--- core/src/main/resources/ApplicationResources_fr.properties	(revision 3127)
+++ core/src/main/resources/ApplicationResources_fr.properties	(working copy)
@@ -667,3 +667,16 @@
 rename=Renommer
 
 tempdirnotset=Le r\u00e9pertoire temporaire n'a pas \u00e9t\u00e9 renseign\u00e9. Suivez les instructions ici <a href="http://www.xwiki.org/xwiki/bin/view/FAQ/WhyAmIGettingANullPointerExceptionWhenUploadingFiles">xwiki.org</a> pour corriger ce probl\u00e8me.
+
+# comments for history
+core.comment=Comment
+core.comment.prompt=Veuillez entrer un commentaire décrivant votre modification
+core.comment.addcomment=Ajout de commentaire
+core.comment.addobject=Ajout d'objet
+core.comment.removeobject=Effacement d'objet
+core.comment.addproperty=Ajout de propriété
+core.comment.updateproperty=Mise à jour de propriété
+core.comment.updatepropertyname=Mise à jour de nom de propriété
+core.comment.createduser=Ajout d'utilisateur
+core.comment.addedusertogroup=Ajout d'utilisateur dans un groupe
+core.comment.rollback=Retour à la version {0}
Index: core/src/main/resources/xwiki.hbm.xml
===================================================================
--- core/src/main/resources/xwiki.hbm.xml	(revision 3127)
+++ core/src/main/resources/xwiki.hbm.xml	(working copy)
@@ -95,6 +95,10 @@
             <column name="XWD_VALIDATION_SCRIPT"  not-null="true" />
         </property>
 
+        <property name="comment" type="string">
+            <column name="XWD_COMMENT" length="255" not-null="true" />
+        </property>
+        
     </class>
 
     <class name="com.xpn.xwiki.doc.XWikiDocumentArchive" table="xwikidoc">
Index: core/src/main/resources/xwiki.oracle.hbm.xml
===================================================================
--- core/src/main/resources/xwiki.oracle.hbm.xml	(revision 3127)
+++ core/src/main/resources/xwiki.oracle.hbm.xml	(working copy)
@@ -362,6 +362,9 @@
         <property name="validationScript"  type="string">
             <column name="XWO_VALIDATION_SCRIPT" sql-type="clob" />
         </property>
+        <property name="comment" type="string">
+            <column name="XWD_COMMENT" length="255"/>
+        </property>
     </class>
 
 
Index: tests/resources/xwiki.hbm.xml
===================================================================
--- tests/resources/xwiki.hbm.xml	(revision 3127)
+++ tests/resources/xwiki.hbm.xml	(working copy)
@@ -95,6 +95,10 @@
             <column name="XWD_VALIDATION_SCRIPT"  not-null="true" />
         </property>
 
+        <property name="comment" type="string">
+            <column name="XWD_COMMENT" length="255" not-null="true" />
+        </property>
+
     </class>
 
     <class name="com.xpn.xwiki.doc.XWikiDocumentArchive" table="xwikidoc">
Index: web/gwt/src/main/java/com/xpn/xwiki/gwt/api/server/XWikiServiceImpl.java
===================================================================
--- web/gwt/src/main/java/com/xpn/xwiki/gwt/api/server/XWikiServiceImpl.java	(revision 3127)
+++ web/gwt/src/main/java/com/xpn/xwiki/gwt/api/server/XWikiServiceImpl.java	(working copy)
@@ -407,6 +407,7 @@
             while(it.hasNext()){
                 objs.add(addObject(doc, (String) it.next()));
             }
+
             context.getWiki().saveDocument(doc, oldDoc, context);
             return objs;
         } catch (XWikiException e) {
Index: web/standard/src/main/webapp/skins/albatross/editactions.vm
===================================================================
--- web/standard/src/main/webapp/skins/albatross/editactions.vm	(revision 3127)
+++ web/standard/src/main/webapp/skins/albatross/editactions.vm	(working copy)
@@ -19,10 +19,32 @@
       return false ;
     }
   }
-  return true; // There is only the wiki editor, with some content
+
+#if($xwiki.isEditCommentSuggested()||$xwiki.isEditCommentMandatory())
+ #if($xwiki.isEditCommentMandatory())
+  var commentField = document.forms.${formname}.comment
+  while (commentField.value=="") {
+    commentField.value = prompt("${msg.get("core.comment.prompt")}");
+  }
+ #else
+  var commentField = document.forms.${formname}.comment
+  if (commentField.value=="") {
+    commentField.value = prompt("${msg.get("core.comment.prompt")}");
+  }
+ #end
+#end
+ return true; // There is only the wiki editor, with some content
 }
 // ]]>
 </script>
+#if((!$commentFieldAdded)&&($xwiki.hasEditComment())
+#set($commentFieldAdded = 1)
+#if($xwiki.isEditCommentHidden())
+<input type="hidden" name="comment" value="" size="80" />
+#else
+$msg.get("core.comment"): <input type="hidden" name="comment" value="" size="80" />
+#end
+#end
 #set($param = "")
 #if ($sectionNumber && ($sectionNumber != 0))
    #set($param = "section=$sectionNumber")
Index: web/standard/src/main/webapp/skins/albatross/editinline.vm
===================================================================
--- web/standard/src/main/webapp/skins/albatross/editinline.vm	(revision 3127)
+++ web/standard/src/main/webapp/skins/albatross/editinline.vm	(working copy)
@@ -19,6 +19,7 @@
 <a href="$doc.getURL("inline", "$!request.getQueryString()&force=1")">$msg.get("forcelock")</a>
 </div>
 #else
+#set($editactions = "top")
 <div class="topbuttons">#template("editactions.vm")</div>
 <div class="clear">
 #foreach($class in $doc.xWikiClasses)
@@ -27,6 +28,7 @@
 #end
 $cdoc.getRenderedContent()
 </div>  ## clear
+#set($editactions = "bottom")
 <div class="bottombuttons">#template("editactions.vm")</div>
 #end
 </div> ## form
Index: web/standard/src/main/webapp/skins/albatross/editwysiwyg.vm
===================================================================
--- web/standard/src/main/webapp/skins/albatross/editwysiwyg.vm	(revision 3127)
+++ web/standard/src/main/webapp/skins/albatross/editwysiwyg.vm	(working copy)
@@ -5,6 +5,7 @@
 <script language="javascript" type="text/javascript" src="${request.contextPath}/wiki_editor/wiki_editor.js"></script>
 #set($xredirect=$!request.getParameter("xredirect"))
 ## <form id="edit" method="post" action="$doc.getURL("preview")" onsubmit="tinyMCE.triggerSave();">
+## #set($editactions = "top")
 ## <div class="topbuttons">#template("editactions.vm")</div>
 <div>
 <div class="hidden">
@@ -21,6 +22,7 @@
 </div>
 </div>
 </div>
+#set($editactions = "bottom")
 <div class="bottombuttons">#template("editactions.vm")</div>
 ## </form>
 <script language="javascript" type="text/javascript">
Index: web/standard/src/main/webapp/skins/albatross/historyinline.vm
===================================================================
--- web/standard/src/main/webapp/skins/albatross/historyinline.vm	(revision 3127)
+++ web/standard/src/main/webapp/skins/albatross/historyinline.vm	(working copy)
@@ -10,6 +10,9 @@
           <th>$msg.get("version")</th>
           <th>$msg.get("reveditor")</th>
           <th>$msg.get("date")</th>
+#if($xwiki.hasEditComment())
+          <th>$msg.get("comment")</th>
+#end
 #if($hasedit || $hasadmin)
           <th></th>
 #end
@@ -38,6 +41,9 @@
           <td>$xwiki.getLocalUserName($newdoc.author)</td>
           <td>$xwiki.formatDate($newdoc.date, "dd/MM/yyyy hh:mm")</td>
 #end
+#if($xwiki.hasEditComment())
+          <td>$!{newdoc.comment}</td>
+#end
 #if($hasedit || $hasadmin)
           <td class="xwikibuttonlink"><a href="$tdoc.getURL("rollback","rev=$nextversion$lang")" onclick="if (confirm('$msg.get("readytorollback") $nextversion')){this.href += '&amp;confirm=1'; return true;} return false;">$msg.get("rollback")</a></td>
 #end
Index: web/standard/src/main/webapp/skins/dodo/editfooter.vm
===================================================================
--- web/standard/src/main/webapp/skins/dodo/editfooter.vm	(revision 3127)
+++ web/standard/src/main/webapp/skins/dodo/editfooter.vm	(working copy)
@@ -1,5 +1,6 @@
 <div class="xwiki${xwikimode}b" id="xwikinav_footer">
 <div class="xwikiactions">
+#set($editactions = "bottom")
 #template("editactions.vm")
 </div>
 </div>
Index: web/standard/src/main/webapp/skins/dodo/preview.vm
===================================================================
--- web/standard/src/main/webapp/skins/dodo/preview.vm	(revision 3127)
+++ web/standard/src/main/webapp/skins/dodo/preview.vm	(working copy)
@@ -16,6 +16,7 @@
 <input type="hidden" name="xnotification" value="$!request.getParameter("xnotification")" />
 <input type="hidden" name="language" value="$!request.getParameter("language")" />
 <input type="hidden" name="isResponsePreviewCorrect" value="$isResponseCorrect">
+<input type="hidden" name="comment" value="$!doc.getComment()" />
 </p>
 <div id="xwikiobject">
 #template("hiddenobject.vm")
Index: web/standard/src/main/webapp/skins/finch/preview.vm
===================================================================
--- web/standard/src/main/webapp/skins/finch/preview.vm	(revision 3127)
+++ web/standard/src/main/webapp/skins/finch/preview.vm	(working copy)
@@ -31,6 +31,8 @@
 <input type="hidden" name="xredirect" value="$!request.getParameter("xredirect")" />
 <input type="hidden" name="xnotification" value="$!request.getParameter("xnotification")" />
 <input type="hidden" name="language" value="$!request.getParameter("language")" />
+<input type="hidden" name="isResponsePreviewCorrect" value="$isResponseCorrect">
+<input type="hidden" name="comment" value="$!doc.getComment()" />
 </div>
 <div id="xwikiobject">
 #template("hiddenobject.vm")
Index: web/standard/src/main/webapp/templates/preview.vm
===================================================================
--- web/standard/src/main/webapp/templates/preview.vm	(revision 3127)
+++ web/standard/src/main/webapp/templates/preview.vm	(working copy)
@@ -16,6 +16,7 @@
 <input type="hidden" name="xnotification" value="$!request.getParameter("xnotification")" />
 <input type="hidden" name="language" value="$!request.getParameter("language")" />
 <input type="hidden" name="isResponsePreviewCorrect" value="$isResponseCorrect">
+<input type="hidden" name="comment" value="$!doc.getComment()" />
 </p>
 <div id="xwikiobject">
 #template("hiddenobject.vm")
Index: web/standard/src/main/webapp/WEB-INF/xwiki.cfg
===================================================================
--- web/standard/src/main/webapp/WEB-INF/xwiki.cfg	(revision 3127)
+++ web/standard/src/main/webapp/WEB-INF/xwiki.cfg	(working copy)
@@ -63,6 +63,12 @@
 xwiki.render.macromapping=1
 xwiki.backlinks=1
 xwiki.tags=1
+## Use edit comments
+xwiki.editcomment=1
+## Hide editcomment field and only use JS
+xwiki.editcomment.hidden=0
+## Make edit comment mandatory
+xwiki.editcomment.mandatory=1
 
 # GraphViz plugin configuration. The GraphViz plugin is not configured by default.
 # To enable it, add "com.xpn.xwiki.plugin.graphviz.GraphVizPlugin" to the list of plugins
